﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Common;
using System;
using Tedu.ARPGDemo.Character;

namespace ARPGDemo.Skill
{
	/// <summary>
    /// 角色技能系统类：为攻击方提供简单释放技能的方法
    /// </summary>
    [RequireComponent(typeof(CharacterSkillManager))]
	public class CharacterSkillSystem : MonoBehaviour {
        private CharacterSkillManager skillManager;
        private Animator anim;
        private SkillData attackSkill;
        private Transform attackTargetTF;
        private void Start()
        {
            skillManager = GetComponent<CharacterSkillManager>();
            anim = GetComponentInChildren<Animator>();
            GetComponentInChildren<AnimationEventBehaviour>().attackHandler += DeploySkill;
        }

        private void DeploySkill()
        {
            skillManager.GenerateSkill(attackSkill);//技能共用一个成员变量，会出现使用冲突，在CharacterStatus类增加IsAttacking方法
        }

        /*
    使用技能攻击：
    1.通过动画调用生成技能方法
    2.如果单攻，朝向目标。
    3.如果单攻，选中目标，等待指定时间自动取消选中。
    4.如果单攻，选中其他目标时，先取消上一个选中目标。
    */

        /// <summary>
        /// 使用指定技能攻击
        /// </summary>
        /// <param name="skillID"></param>
        /// <param name="isBatter"></param>
        public void AttackUseSkill(int skillID, bool isBatter)
        {
            //如果连击，获取下一个技能编号。
            if (attackSkill != null && isBatter)
            {
                skillID = attackSkill.nextBatterId;
            }
            //准备技能
            attackSkill = skillManager.PrepareSkill(skillID);
            //var data = GetComponent<CharacterSkillManager>().PrepareSkill(skillID);
            //如果成功则播放动画（生成技能通过动画事件调用）
            if (attackSkill == null)
            {
                return;
            }
            anim.SetBool(attackSkill.animationName,true);
            if (attackSkill.attackType != SkillAttackType.Single)
            {
                return;
            }
            //attackTargetTF = SelectTarget();
            var targetTF = SelectTarget();
            transform.LookAt(targetTF);
            //如果是单攻，朝向目标。（根据当前技能信息查找目标）
            //选中目标（CharacterSelected角色选择器中选中方法）
            ShowSelectedFx(false);//上一个设为false
            attackTargetTF = targetTF;
            ShowSelectedFx(true);
            //选中其他目标时，先取消上一个选中目标。

            //CharacterSelected角色选择器
            //附加在敌人物体中
            //提供选中/取消功能：（等待指定时间自动取消选中）
        }

        //计算攻击目标
        private Transform SelectTarget()
        {
            //通过扇形选区 获取目标
            var list = new SectorAttackSelector().SelectTarget(attackSkill, transform);
            return list!=null ? list[0]:null;
        }
        private void ShowSelectedFx(bool state)
        {
            if (attackTargetTF == null)
            {
                return;
            }
            var selected = attackTargetTF.GetComponent<CharacterSelected>();
            if (selected != null)
            {
                selected.SetSelectedActive(state);
            }
        }
        /// <summary>
        /// 使用随机技能攻击(为NPC提供)
        /// </summary>
        public void UseRandomSkill()
        {
            //1.筛选可以使用的技能
            var usableSkills = skillManager.skills.FindAll(s => skillManager.PrepareSkill(s.skillID) != null);
            //2.随机选择一个
            if (usableSkills.Count > 0)
            {
                int index = UnityEngine.Random.Range(0, usableSkills.Count);
                int skillId = usableSkills[index].skillID;
                AttackUseSkill(skillId, false);
            }
        }


    }
}

